package top.i89ck.modules.service;

import com.jfinal.kit.Kv;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.activerecord.SqlPara;
import top.i89ck.common.utils.Const;
import top.i89ck.modules.model.User;
import top.i89ck.modules.utils.Pager;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import top.i89ck.modules.utils.Subject;

import java.util.Objects;

/**
 * 用户服务的基础管理操作类
 *
 * @author YINGFU
 */
public class UserService {

    /**
     * 分页查询用户的列表数据。用于展示系统中的用户信息
     *
     * @param pager
     * @param data  查询条件
     * @return
     */
    public Page<Record> getPage(Pager pager, Kv data) {
        SqlPara sqlPara = Db.getSqlPara("sysUser.getAll", data);
        return Db.paginate(pager.getPageNum(), pager.getPageSize(), sqlPara);
    }


    /**
     * 通过用户主键查询用户的相关信息数据
     *
     * @param userId 用户主键
     * @return
     */
    public User findById(Long userId) {
        return User.dao.findById(userId);
    }


    /**
     * 通过账号和密码，验证当前登录的用户
     *
     * @param loginName
     * @param loginPassword
     * @return
     */
    public User getCheckLogin(String loginName, String loginPassword) {
        Kv data = Kv.by("loginName", loginName).set("loginPassword", SecureUtil.md5(loginPassword).toUpperCase());
        SqlPara sqlPara = Db.getSqlPara("sysUser.getCheckLogin", data);
        return User.dao.findFirst(sqlPara);
    }

    /**
     * 更新当前用户的密码
     *
     * @param newPassword
     * @param sessionUser
     * @return
     */
    public boolean updatePwd(String newPassword, User sessionUser) {
        User user = new User();
        user.setId(sessionUser.getId());
        user.setLoginPassword(SecureUtil.md5(newPassword).toUpperCase());
        user.setUpdatedTime(DateUtil.date());
        user.setUpdatedBy(sessionUser.getLoginName());
        return user.update();
    }

    /**
     * 新增一条用户的信息
     *
     * @param user
     * @return
     */
    public boolean save(User user) {
        User sessionUser = Subject.getSessionUser();
        if (Objects.isNull(user.getId())) {
            return insert(user, sessionUser);
        } else {
            User entity = findById(user.getId());
            if (null == entity) {
                return insert(user, sessionUser);
            } else {
                user.setUpdatedTime(DateUtil.date());
                user.setUpdatedBy(sessionUser.getLoginName());
                return user.update();
            }
        }
    }

    /**
     * 向数据库插入数据
     *
     * @param user
     * @param sessionUser
     * @return
     */
    private boolean insert(User user, User sessionUser) {
        String loginPassword;
        if (StrUtil.isBlank(user.getLoginPassword())) {
            loginPassword = Const.DEF_PWD;
        } else {
            loginPassword = SecureUtil.md5(user.getLoginPassword()).toUpperCase();
        }
        user.setLoginPassword(loginPassword);
        user.setCreatedTime(DateUtil.date());
        user.setCreatedBy(sessionUser.getLoginName());
        user.setDeleted(false);
        return user.save();
    }

}
